#include <iostream>

/*
内联函数是c++为了提高程序的运行速度而提出来的，他与常规函数的区别在于c++编译器如何将他们组合到程序里面去
常规函数的调用使得程序跳转到另外一个地址，执行完成后返回原地址，这样来回跳跃并记录条约的位置需要一定的开销

而对于内联函数：编译器使用了相应的函数代码替换了函数调用，所以对于内联代码程序无需跳到另一个位置，所以
运行速度稍微快一点，代价是占用更多的内存。

如果程序在10个不同的地方调用同一个内联函数，那么总的程序将包含这个函数的10个副本
*/

/*
如何选择是否调用内联函数??
1. 如果函数逻辑复杂，以至于执行函数的时间比处理函数的调用机制的时间长，就没必要使用内联函数
2. 如果函数简单，执行时间短，可以使用内联函数
*/

/*
如何使用：
1. 在函数申明前加上关键字inline
2. 在函数定义前加上关键字inline
3. 内联函数不能递归，也不能过大
*/

#define SQUARE(x) x*x 
inline double square(double x){return x*x;}
//虽然内联函数是将函数代码替换了函数调用，但参数也是值传递的，不同于宏，宏函数并不是通过传递参数
// 实现的，而是通过文本替换，

/*
内联函数和宏函数区别：
内联函数使用值传递参数，宏函数使用文本替换，
内联函数完胜
*/

int main(){
    using namespace std;
    double a;
    int b = 9;
    cout << square(10) << endl;
    cout << square(4.5 + 5.5) << endl;
    cout << square(b++) << endl;

    cout << SQUARE(10) << endl;
    cout << SQUARE(4.5 + 5.5) << endl;  //这里的文本替换 4.5 + 5.5*4.5 + 5.5
    cout << SQUARE(b++) << endl; // 文本替换 b++*b++
    return 0;
}
/*
如果C语言使用了宏函数，那么尽量改成内联函数
*/
